/*
 * main.c
 *
 *  Created on: Oct 16, 2013
 *      Author: IEUser
 */


/******************************************************************************************
 *	Deklaracje dołączanych plików nagłówkowych i bibliotek								 *
 *****************************************************************************************/
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>

#include "nrf24l01.h"
#include "uart.h"

/******************************************************************************************
 *	Deklaracje zmiennych globalnych								                         *
 *****************************************************************************************/
char nrf_data[PAYLOAD];

typedef union{
	struct{
		uint8_t tx_full		:1;
		uint8_t rx_p_no		:3;
		uint8_t max_rt		:1;
		uint8_t tx_ds		:1;
		uint8_t rx_dr		:1;
		uint8_t reserved	:1;
	};
	uint8_t status;
}TStatus;

TStatus status_flags;

/******************************************************************************************
 *	Funkcje pomocnicze programu głównego						                         *
 *****************************************************************************************/

//wskaznik do funkcji callback dla zdarzenia NRF24L01_EVENT
static void (*nrf24l01_event_callback)(char *bufor);

//funkcja do rejestracji funkcji zwrotnej w zdarzeniu NRF24L01
void register_nrf24l01_event_callback(void (*callback)(char *bufor)){
	nrf24l01_event_callback = callback;
}

//funkcja odbioru danych z bufora odbiorczego
void nrf24l01_parse(char *bufor){
	if(status_flags.rx_dr){
		uart_write_text_P(PSTR("Odebrane dane z PIPE: "));
		uart_write_int(status_flags.rx_p_no, 0);
		uart_write_text_P(PSTR("\r\n---------------------\r\n"));

		nrf24l01_get_data(nrf_data);

		uart_write_text(nrf_data);
		uart_write_text_P(PSTR("\r\n\r\n"));

		PORTB ^= (1<<PB0);

		status_flags.rx_dr = 0;
	}
}
void NRF24L01_EVENT(char *bufor){
	if(status_flags.status != 0x0E){ //rejestr statusowy jest inny niz wartosc domyslna
		if(nrf24l01_event_callback)	(*nrf24l01_event_callback)(nrf_data); //wywolanie zarejestrowanej funkcji
	}
}



/******************************************************************************************
 *	Funkcja główna															 			 *
 *****************************************************************************************/
int main(void){

	/************************ Deklaracja zmiennych lokalnych ************************/

	/************************** Inicjalizacja podzespołów ***************************/
	nrf24l01_init();
	_delay_ms(10);
	uart_init(_UBRR);

	//rejestracja wlasnej funkcji(nrf24l01_parse) do odbioru danych z bfora odbiorczego
	register_nrf24l01_event_callback(nrf24l01_parse);

	DDRB |= (1<<PB0);

#if defined (__AVR_ATmega88__)
	EICRA |= (1<<ISC01);
	EIMSK |= (1<<INT0);
#elif defined (__AVR_ATmega8__) || (__AVR_ATmega32__)
	MCUCR |= (1<<ISC01);
	GICR |= (1<<INT0);
#endif

	PORTD |= (1<<PD2);

	sei();

	nrf24l01_config(RX_MODE);

	/********************************* Pętla główna *********************************/
	while(1){
		NRF24L01_EVENT(nrf_data);
	}

	return 0;
}

/******************************************************************************************
 *	Deklaracje funkcji obsługi przerwań								  					 *
 *****************************************************************************************/
ISR(INT0_vect){
	nrf24l01_read_register(STATUS, &status_flags.status, 1);
}
/******************************************************************************************
 *	Koniec pliku main.c
 *****************************************************************************************/
